/*
 * @Author: Qimu
 * @Date: 2020-04-20 13:38:40
 * @LastEditors: Qimu
 * @LastEditTime: 2020-06-26 20:51:24
 * @Description: file content
 * @FilePath: \vue-admin-koa2\koa2_api\controllers\admin.js
 */
const Admin = require('../module/schama/admin');
const tools = require('../module/utlis/tools');
const query = require('../module/utlis/query');
const config = require('../module/config/config');

//管理员用户业务
class AdminController {
  //管理员头像上传
  static async uploadAvatar(ctx) {
    ctx.body = {
      'data': {
        filename: `${config.app.host}:${config.app.port}/admin/avatars/${ctx.req.file.filename}`//返回头像文件名
      },
      'meta': {
        'status': 200,
        'message': `恭喜上传头像成功!`
      }
    }
  }

  //管理员用户新增(POST)
  static async setAdmin(ctx) {
    let queryAdminResult;
    const { admin_name, admin_password, admin_email, admin_avatar, admin_tel, admin_role } = ctx.request.body;
    const data = { admin_name, admin_password: tools.md5(admin_password), admin_email, admin_avatar, admin_tel, admin_role, create_adminTime: tools.GMTtoStr(new Date()), last_loginTime: tools.GMTtoStr(new Date()) }//用户注册数据
    queryAdminResult = await query.find(Admin, { admin_email });//查找数据结果
    if (queryAdminResult.length > 0) {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': `${admin_email}邮箱已经存在!`
        }
      }
    } else {
      await query.save(Admin, data)//保存管理员注册新增数据
      ctx.body = {
        'data': {},
        'meta': {
          'status': 200,
          'message': `恭喜${admin_email}邮箱注册成功!`
        }
      }
    }
  }

  //管理员登录(创建token)(POST)
  static async adminLogin(ctx) {
    const { admin_name, admin_password } = ctx.request.body;
    let queryLoginResult = await query.find(Admin, { admin_name });
    if (queryLoginResult.length === 0) {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': '该用户/邮箱不存在!'
        }
      };
    } else {
      //查到后验证密码,jwt生成token
      let payload = {
        id: queryLoginResult[0]._id,
        admin_name: queryLoginResult[0].admin_name,
        admin_avatar: queryLoginResult[0].admin_avatar,
      }
      await query.updateOne(Admin, { _id: queryLoginResult[0]._id }, { last_loginTime: tools.GMTtoStr(new Date()) });//修改数据库登录时间
      const token = await tools.signToken(payload, config.accessJwt.secret, config.accessJwt.expiresIn);//生成access-token
      if (queryLoginResult[0].admin_password === tools.md5(admin_password) && queryLoginResult[0].admin_status === 1) {
        ctx.body = {
          'data': {
            'token': token,
            'userInfo': {
              admin_avatar: queryLoginResult[0].admin_avatar,
              admin_email: queryLoginResult[0].admin_email,
              admin_name: queryLoginResult[0].admin_name
            }
          },
          meta: {
            'status': 200,
            'message': `${admin_name}登录成功!`
          }
        }
      } else if (queryLoginResult[0].admin_password === tools.md5(admin_password) && queryLoginResult[0].admin_status === 0) {
        ctx.body = {
          'meta': {
            'status': 500,
            'message': `${admin_name}账号已被禁用,请联系管理员!`
          }
        };
      } else {
        ctx.body = {
          'meta': {
            'status': 500,
            'message': '登录密码错误!'
          }
        }
      }
    }
  }

  //获取管理员数据列表(GET)
  static async listAdmin(ctx) {
    const options = [
      {
        $project: {
          admin_avatar: 1,
          admin_email: 1,
          admin_name: 1,
          admin_tel: 1,
          admin_role: 1,
          last_loginTime: 1,
          admin_status: 1,
        }
      }
    ]
    let queryAdminResult = await query.aggregate(Admin, options);//查找管理员数据结果
    if (queryAdminResult.length > 0) {
      ctx.body = {
        'data': queryAdminResult,
        'meta': {
          'status': 200,
          'message': '管理员获取成功!'
        }
      }
    } else {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': '管理员获取失败!'
        }
      }
    }
  }

  //修改管理员状态
  static async updateAdmin(ctx) {
    const { _id, admin_name, admin_status } = ctx.request.body;
    let updateAdminResult
    updateAdminResult = await query.updateOne(Admin, { _id }, { admin_status });
    //更新管理员数据结果
    if (updateAdminResult.ok === 1) {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 200,
          'message': `${admin_name}-管理员状态编辑成功!`
        }
      }
    } else {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': `${admin_name}-管理员状态编辑失败!`
        }
      }
    }
  }

  //提交编辑管理员
  static async putEditAdmin(ctx) {
    let updateAdminResult //编辑管理员后变量保存
    const { _id, admin_name, admin_email, admin_tel, admin_role } = ctx.request.body;
    updateAdminResult = await query.updateOne(Admin, { _id }, { admin_name, admin_email, admin_tel, admin_role });//更新管理员数据结果
    if (updateAdminResult.ok === 1) {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 200,
          'message': `${admin_name}-管理员编辑成功!`
        }
      }
    } else {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': `${admin_name}-管理员编辑失败!`
        }
      }
    }
  }

  //删除管理员
  static async deleteAdmin(ctx) {
    let deleteAdminResult
    deleteAdminResult = await query.findByIdAndDelete(Admin, { _id: ctx.params.id });//删除管理员数据结果
    if (deleteAdminResult) {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 200,
          'message': `${deleteAdminResult.admin_name}-角色删除成功!`
        }
      }
    } else {
      ctx.body = {
        'data': {},
        'meta': {
          'status': 500,
          'message': `${deleteAdminResult.admin_name}-角色删除失败!`
        }
      }
    }
  }

  //管理员退出(由前台控制即可)
  static async logout(ctx) {
    // ctx.success({
    //   msg: '退出成功!',
    //   success: true
    // });
    ctx.body = {
      'code': 1,
      'message': '退出成功!'
    }
  }

  //重置密码
  // static async resetPwd(ctx) {
  //   const uid = ctx.request.body.id;
  //   const password = md5(ctx.request.body.password);
  //   await User
  //     .findByIdAndUpdate(uid, {
  //       password
  //     })
  //     .exec()
  //     .catch(err => {
  //       ctx.throw(500, '服务器内部错误-modifyPwd错误！');
  //     });
  //   ctx.success({
  //     msg: '更改管理员密码成功!',
  //     success: true
  //   });
  // }
}

exports = module.exports = AdminController;